package com.ys.io.p1随机读写数据;

import java.io.RandomAccessFile;

/**
 * 描述:
 *
 * @author CodeYang
 * @version 2021/1/4 20:35
 */
public class p2随机读写文件了解与使用2 {

    private static Student[] students = {
            new Student("ZhangSan", 18),
            new Student("Lisi", 17),
            new Student("WangWu", 21),
    };

    public static void main(String[] args) {

        method01();
        method02();

    }

    /**
     * 使用读者模式创建对象
     */
    private static void method02() {
        try (
                RandomAccessFile rafRead = new RandomAccessFile("day_25//obj2.txt", "r");
        ) {
            /**
             * 读取第二个Student信息，步骤如下：
             * 1 调用skipBytes(n)方法跳过第一个Student
             * 2 读取学生姓名：调用read方法读取每一个bytes
             * 3 读取学生年龄：调用readInt()
             */
            System.out.println("读取之前光标的位置："+rafRead.getFilePointer());
            // 跳过第一个Student对象：姓名占据了8bytes，年龄占据了4bytes
            rafRead.skipBytes(12);
            System.out.println("当前光标的位置："+rafRead.getFilePointer());
            // 使用循环逐个读取每一个byte

            // 使用循环逐个读取每一个byte
            for (int i = 0; i < 4; i++) {
                char data = (char)rafRead.read();
                System.out.print(data+" ");
            }
            // 读取李四年龄
            int liSiAge = rafRead.readInt();
            System.out.print(liSiAge);
            System.out.println();
            /**
             * 读张三
             * 重新设置光标的位置，回头读取第一个学生的信息，步骤如下：
             * 1 调用seek(index)方法设置光标的位置(索引下标)
             * 2 读取学生姓名(使用循环逐个读取学生姓名的每一个字符)
             * 3 读取学生年龄
             */
            rafRead.seek(0);
            for (int i = 0; i < 8; i++) {
                char data2 = (char) rafRead.read();
                System.out.print(data2+" ");
            }

            int zhangSanAge = rafRead.readInt();
            System.out.print(zhangSanAge);
            System.out.println();

            System.out.println("当前光标的位置："+rafRead.getFilePointer());
            /**
             * 张三读取完毕，跳过8个bytes读取王五的信息
             */
            rafRead.skipBytes(8);
            System.out.println("当前光标的位置："+rafRead.getFilePointer());
            for (int i = 0; i < 6; i++) {
                char data3 = (char) rafRead.read();
                System.out.print(data3+" ");
            }
            // 读取王五年龄
            int wangWuAge = rafRead.readInt();
            System.out.println(wangWuAge);

        } catch (Exception e) {

        }

    }

    /**
     * 写入 返回 光标指针
     */
    private static void method01() {
        /**
         * 创建RandomAccessFile对象将所有Student对象数据写入磁盘
         */
        try (
                RandomAccessFile raf = new RandomAccessFile("day_25//obj2.txt", "rw");
        ) {
            /**
             * 遍历数组所有元素，将每个Student对象写入磁盘文件
             */
            for (Student stu : students) {
                // 写入学生名称：先将学生姓名转换为字节数组然后写入
                raf.write(stu.getName().getBytes());
                // 写入学生年龄
                raf.writeInt(stu.getAge());
                // 获取每次写入数据之后的光标所在的位置
                long filePointer = raf.getFilePointer();
                System.out.println("光标所在的位置：" + filePointer);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
